#include <stdio.h>

#include "Circle.h"
#include "Circle_r.h"

/* ----------------------------------------------------------------------------------------------- *
 *	CIRCLE : реализация методов
 */

static void * Circle_ctor(void * _pSelf, va_list * ppArgs)
{
	// переопределённый конструктор

	// вызываем конструктор базового типа POINT
	struct Circle * pSelf = base_ctor(Circle, _pSelf, ppArgs);

	// доинициализируем окружность
	pSelf->rad = va_arg( *ppArgs, int );

	return pSelf;
}

static void Circle_draw(const void * _pSelf)
{
	// переопределённое рисование

	const CIRCLE * pSelf = _pSelf;
	const POINT * pBase = _pSelf;

	printf("circle at %d,%d rad %d\n", pBase->x, pBase->y, pSelf->rad);
}

/* ----------------------------------------------------------------------------------------------- *
 *	объявление переменных с мета-информацией о типе CIRCLE
 */

static POINT_CLASS circle_info; // мета-информация о типе CIRCLE

/* ----------------------------------------------------------------------------------------------- *
 *	инициализация "красивых" констант-указателей на мета-информацию о CIRCLE
 */

const void * Circle = &circle_info;

/* ----------------------------------------------------------------------------------------------- *
 *	автоматическая инициализация структур с мета-информацией об CIRCLE
 */

void init_CircleClass(void)
{
	init_PointClass();

	inplace_new(
		&circle_info, // мета-информация о типе CIRCLE
		PointClass,   // мета-информация является экземпляром типа POINT_CLASS

		"Circle",       // символическое имя типа
		Point,          // мета-информация о предке (предок CIRCLE -> POINT)
		sizeof(CIRCLE), // размер типа в байтах

		ctor, Circle_ctor, // переопределено динамическое связывание ctor -> Circle_ctor
		draw, Circle_draw, // переопределено динамическое связывание draw -> Circle_draw
		0
	);
}
